package com.atguigu.config;

import com.atguigu.bean.Color;
import com.atguigu.bean.ColorFactoryBean;
import com.atguigu.bean.Person;
import com.atguigu.bean.Red;
import com.atguigu.config.condition.LinuxCondition;
import com.atguigu.config.condition.MyImportBeanDefinitionRegistrar;
import com.atguigu.config.condition.MyImportSelector;
import com.atguigu.config.condition.WindowsCondition;
import org.springframework.context.annotation.*;


/**
 * 容器注册组件：
 *      1.包扫描+组件标注@controller、service、repository、conponent，只局限于自己创建的类
 *      2.@Bean[导入的第三方包组件]
 *      3.@Import(classes)
 *          1，直接import，组件id默认是全类名
 *          2.ImportSelector,返回组件的全类名数组
 *          3.ImportBeanDefinitionRegistrar 手动注册bean
 *          4.使用FactoryBean
 *
 * 1，默认获取的是工厂bean调用getObject创建的额对象
 * 2，要获取工厂bean本身，需要在bean id前面加上&
 */
@Configuration
@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig2 {

    /**
     * prototype 多实例的，ioc容器启动时不会调用方法创建对象放在容器中，
     * 每次获取的时候才会调用方法创建对象
     * singleton 单例，ioc容器启动时会调用方法创建对象到ioc容器中
     * <p>
     * lazy对singleton进行懒加载，容器启动先不创建对象，在第一次获取bean的时候在创建对象并初始化
     */
    @Scope("singleton")
    @Lazy
    @Bean
    public Person person02() {
        System.out.println("容器中添加z3");
        return new Person("z3", 25);
    }


    /**
     * @Conditional 条件注册bean
     */
    @Bean
    @Conditional({WindowsCondition.class})
    public Person p3() {
        return new Person("bill", 62);
    }

    @Bean
    @Conditional({LinuxCondition.class})
    public Person p4() {
        return new Person("linus", 82);
    }

    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}
